package initialize

import (
	"go.uber.org/zap"
	"strings"
	"sync"

	"lz/global"
	"lz/utils"

	"github.com/robfig/cron/v3"
)

var (
	//所有的定时方法
	allTaskFuncs = []func(){
		//handler.PushStatusRun,
	}
)

// 初始化定时器
func InitTimer() {
	allTasks := make(map[string]func(), 0)
	for _, f := range allTaskFuncs {
		allTasks[utils.GetFuncName(f, '.')] = f
	}
	config := global.ServerConfig.Timer
	if !config.IsEnable {
		zap.S().Info("定时任务配置已禁用")
		return
	}
	var wg sync.WaitGroup
	var successTasks []string
	var numPlanTask int64 = 0
	LcTimer := utils.NewTimerTask()
	for _, v := range config.Detail {
		if !v.IsEnable {
			continue
		}
		wg.Add(1)
		numPlanTask++
		go func(name string, spec string) {
			defer wg.Done()
			//支持到秒
			var option []cron.Option
			if config.WithSeconds {
				option = append(option, cron.WithSeconds())
			}
			//获取定时任务执行函数
			method, ok := allTasks[name]
			if !ok {
				zap.S().Infof("定时任务不存在=%v", name)
				return
			}
			//加入周期化任务
			//全局定时任务
			taskId, err := LcTimer.AddTaskByFunc(name, spec, method, option...)
			if err != nil {
				zap.S().Errorf("添加定时任务失败返回结果:%v,错误信息%v", err, taskId)
			} else {
				successTasks = append(successTasks, name)
			}

		}(v.TaskName, v.Spec)
	}

	wg.Wait()

	zap.S().Debug(strings.Repeat("=", 15) + " 计划任务 " + strings.Repeat("=", 15))
	zap.S().Infof("计划任务：%d个 成功：%d个", numPlanTask, int64(len(successTasks)))
	zap.S().Infof("计划成功：%v", successTasks)
	zap.S().Debug(strings.Repeat("=", 40))
}
